-- FUNCTION: cliente.cot_getarchivoremito(integer)

-- DROP FUNCTION cliente.cot_getarchivoremito(integer);

CREATE OR REPLACE FUNCTION cliente.cot_getarchivoremito(
	integer)
    RETURNS character varying
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE 
AS $BODY$
DECLARE
pIdComm		ALIAS FOR $1;
-- configurables
vCOT_modoUso          VARCHAR;
vCOT_EquipoHabilitado VARCHAR;
vCOT_EquipoNombre     VARCHAR;
vCOT_VarPre           VARCHAR;
vCOT_CuitAbaco        VARCHAR;
vCOT_NroCCos_Patente  VARCHAR;
-- const
vregistro_01		VARCHAR;
vregistro_02		VARCHAR;
vregistro_03		VARCHAR;
vregistro_04		VARCHAR;
vlistaRegistros_03	VARCHAR;
vLF		  	VARCHAR;
vSep			VARCHAR;
-- longitudes campos Registro-03
vLong_PropioCodProd	INTEGER;
vLong_PropioDescProd	INTEGER;
vLong_PropioCodUni	INTEGER;
--
vAfipCbteTipo_091	INTEGER;
vSinNumero		VARCHAR;
vBoolFalse_Cero		VARCHAR;
vBoolTrue_Uno		VARCHAR;
vBoolFalse_NO		VARCHAR;
vBoolTrue_SI		VARCHAR;
vFtoImporte_12_2	VARCHAR;
vFtoCantidad_13_2	VARCHAR;
vFtoCodArt_6		VARCHAR;
vFtoCodArtUni_1		VARCHAR;
vSinInformar		VARCHAR;
vSinInformar_ArbaCodArtUni INTEGER;
vSinInformar_CodArtUni	VARCHAR;
-- campos archivo
vEmpresaCuit         VARCHAR;
vCodigoUnico         VARCHAR;
vOrigenCuit          VARCHAR;
vOrigenNombre        VARCHAR;   
vOrigenDomCalle      VARCHAR;
vOrigenDomNro        VARCHAR;
vOrigenDomComple     VARCHAR;
vOrigenDomPiso       VARCHAR;
vOrigenDomDepto      VARCHAR;
vOrigenDomBarrio     VARCHAR;
vOrigenDomCodPostal  VARCHAR;
vOrigenDomLocalidad  VARCHAR;
vOrigenDomProv       VARCHAR;
vEmisorTenedor       VARCHAR;
vSujetoGenerador     VARCHAR;
vDestinatarioConsumidorFinal  VARCHAR;
vDestinatarioTipoDoc      VARCHAR;
vDestinatarioNroDoc       VARCHAR;
vDestinatarioCuit         VARCHAR;
vDestinatarioNombre       VARCHAR;
vDestinatarioTenedor      VARCHAR; 
vDestinoDomCalle          VARCHAR;
vDestinoDomNro            VARCHAR;
vDestinoDomComple         VARCHAR;
vDestinoDomPiso           VARCHAR;
vDestinoDomDepto          VARCHAR;
vDestinoDomBarrio         VARCHAR;
vDestinoDomCodPostal      VARCHAR;
vDestinoDomLocalidad      VARCHAR;
vDestinoDomProv           VARCHAR;
vRecorridoTipo            VARCHAR;
vRecorridoLocalidad       VARCHAR;
vRecorridoCalle           VARCHAR;
vRecorridoRuta            VARCHAR;
vPatenteVehiculo          VARCHAR;
vPatenteAcoplado          VARCHAR;
vEntregaDomicilioOrigen   VARCHAR;
vProductoNoTermDev        VARCHAR;
vTransportistaCuit        VARCHAR;
vImporteTotal             NUMERIC(16, 2);
vMontoLimiteAnonimo       NUMERIC(16, 2);
vFecha                    VARCHAR;
vTrasnporteFechaSalida    VARCHAR;
vTransporteHoraSalida     VARCHAR;
vArtm_row                 RECORD;
-- valores que creo NO se usan mas pero han quedado en el archivo a enviar por compatibilidad
vPropioDestinoDomicilioCodigo VARCHAR;
BEGIN
-- ==== valores de configuracion ===
--modo uso del web service (prod: produccion; homo: testing; haba: testing en nombre de Abaco)
vCOT_modoUso = Upper((SELECT str_get_atrib_ini(ini, 'RemitoElectronicoARBA_ModoUso') FROM ambcfg WHERE id = 1));

--equipoHabilitado, Nro CCosto para patente vehiculo, varpre para obtener codigo articulo ARBA
SELECT ambequ.habilitadocotxws, ambequ.nombre, 
       trim(str_get_atrib_ini(com.param, 'COTNroCCosPatente')), 
       trim(str_get_atrib_ini(com.param, 'COTVarPreARBACodArt'))
	INTO vCOT_EquipoHabilitado, vCOT_EquipoNombre, vCOT_NroCCos_Patente, vCOT_varPre
FROM comm 
     INNER JOIN com ON comm.tipocom = com.tipo
     INNER JOIN ambequ ON comm.nombreambequ = ambequ.nombre     
WHERE comm.id = pIdComm;

/*
RAISE NOTICE 'vCOT_modoUso: %', vCOT_modoUso;
RAISE NOTICE 'vCOT_EquipoHabilitado: %', vCOT_EquipoHabilitado;
RAISE NOTICE 'vCOT_NroCCos_Patente: %', vCOT_NroCCos_Patente;
RAISE NOTICE 'vCOT_varPre: %', vCOT_varPre;
*/

--verificar equipo habilitado para usar webservice COT
/*
IF (COALESCE(vCOT_modoUso, '') = '') THEN
  RAISE EXCEPTION  'El sistema no esta habilitado para obtener COT utilizando un Servicio Web';
END IF;
IF (vCOT_modoUso = 'PROD') AND (vCOT_EquipoHabilitado = 'N') THEN
  RAISE EXCEPTION  'El equipo no esta habilitado para obtener COT utilizando un Servicio Web. Equipo: % ', vCOT_EquipoNombre;
END IF;
*/
IF (COALESCE(vCOT_varPre, '') = '') THEN
  vCOT_varPre := 'COT';
  --RAISE EXCEPTION  'No se ha definido la variable de precios para obtener los codigos de articulos ARBA. Verifique la configuracion del comprobante.';
END IF;
-- ==============
--cuit para modo HABA
vCOT_CuitAbaco='30648593542';

-- separador para ver los valores mas separados (para debugging)
-- vSep='  |  ';
-- vLF=chr(10);
vSep='|';
vLF=chr(13)||chr(10);
vSinInformar = ' ';
vBoolFalse_Cero = '0';
vBoolFalse_NO   = 'NO';
vBoolTrue_Uno   = '1';
vBoolTrue_SI    = 'SI';
vSinNumero = 'S/N';
vAfipCbteTipo_091='91'; -- codigo afip Remito

-- Monto a partir del cual requiere datos del destinatario
vMontoLimiteAnonimo=5000.00;
-- Fto para Importe y Cantidad
 -- V  -> with to_char multiplies the input values by 10^n, where n is the number of digits following
 -- FM -> fill mode (suppress leading zeroes and padding blanks)
vFtoImporte_12_2  = 'FM000000000009V99';  -- 12 enteros y 2 decimales; ultimas 2 posiciones se toman como decimales SIEMPRE 
vFtoCantidad_13_2 = 'FM0000000000009V99'; -- 13 enteros y 2 decimales; ultimas 2 posiciones se toman como decimales SIEMPRE 
--vFtoCodArt_6 = 'FM999999'; -- 6 enteros 
vFtoCodArt_6 = 'FM000000'; -- 6 enteros 
vFtoCodArtUni_1 = 'FM9'; -- 1 entero
-- 
-- Recuperar datos del remito a COTeizar
-- Tipo Itinerario ( 1. Urbano , 2. Rural , 3. Mixto)
-- Modo PROD (produccion)/HOMO (testing): se pide COT en nombre de la empresa 
-- Modo HABA: se pide COT (testing) en nombre de abaco
SELECT
       CASE WHEN vCOT_ModoUso = 'HABA' THEN vCOT_CuitAbaco
            WHEN vCOT_ModoUso IN ('HOMO', 'PROD') THEN COALESCE(str_solo_digitos(ambemp.cuit), '???????????')
            ELSE '???????????'
       END, 
	   ambemp.nombre, 
       ambemp.domicilio,
       ambemp.codpostal,
       ciuorigen.nombre,
       ciuorigen.codciupro,
       TO_CHAR(comm.fecha, 'YYYYMMDD'), TO_CHAR(comm.cotfechatraslado, 'YYYYMMDD'), 
       TO_CHAR(COALESCE(comm.afipcbtetipo, vAfipCbteTipo_091), 'FM000')||COALESCE(TO_CHAR(comm.nroptovta, 'FM00000'), '?????')||
	   COALESCE(TO_CHAR(comm.nro, 'FM00000000'), '????????'),
       pad.tipopaddoc, pad.nrodoc, str_solo_digitos(pad.cuit), pad.nombre, 
 --    CASE WHEN pad.codpadiva = 'F' THEN vBoolTrue_Uno ELSE vBoolFalse_Cero END, 
       '0',  
       CASE WHEN gps.id is null THEN cliente.cot_calle(pad.domicilio) ELSE gps.calle END,
       CASE WHEN gps.id is null THEN cliente.cot_numero(pad.domicilio) ELSE gps.numero END,
       CASE WHEN gps.id is null THEN '' ELSE gps.piso END,
       CASE WHEN gps.id is null THEN '' ELSE gps.depto END,
       CASE WHEN gps.id is null THEN '' ELSE gps.barrio END,
       CASE WHEN gps.id is null THEN pad.codpostal ELSE ciugps.codpostal END,
       CASE WHEN gps.id is null THEN ciupad.codpostal ELSE ciugps.codpostal END,
       CASE WHEN gps.id is null THEN ciupad.codciupro ELSE ciugps.codciupro END,
       CASE WHEN gps.id is null THEN 'M' ELSE 
        CASE gps.tipoitinerario
                 WHEN 1 THEN 'U' 
                 WHEN 2 THEN 'R' 
                 WHEN 3 THEN 'M'
            ELSE ''
            END
       END,
       COALESCE(str_solo_digitos(COALESCE(padtra.cuit, CASE WHEN vCOT_ModoUso = 'HABA' THEN vCOT_CuitAbaco
                                                            WHEN vCOT_ModoUso IN ('HOMO', 'PROD') THEN COALESCE(str_solo_digitos(ambemp.cuit), '???????????')
                                                            ELSE '???????????'
                                                       END, '-')), '???????????'),
       ctbcos_patente.cod
       INTO
       vEmpresaCuit, vOrigenNombre, vOrigenDomCalle, vOrigenDomCodPostal, vOrigenDomLocalidad, vOrigenDomProv,
       vFecha, vTrasnporteFechaSalida, 
       vCodigoUnico,
       vDestinatarioTipoDoc, vDestinatarioNroDoc, vDestinatarioCuit, vDestinatarioNombre, 
       vDestinatarioConsumidorFinal,
       vDestinoDomCalle, vDestinoDomNro, vDestinoDomPiso, vDestinoDomDepto, vDestinoDomBarrio, vDestinoDomCodPostal, vDestinoDomLocalidad, vDestinoDomProv,
       vRecorridoTipo,
       vTransportistaCuit, vPatenteVehiculo
FROM comm
INNER JOIN ambempsuc ON comm.codambsuc = ambempsuc.codambsuc
INNER JOIN ambemp ON ambempsuc.codambemp = ambemp.cod
INNER JOIN ciu ciuorigen ON ambemp.idciudad = ciuorigen.id
LEFT JOIN pad ON comm.idpad = pad.id
LEFT JOIN ciu ON pad.idciudadlegal = ciu.id
LEFT JOIN pad padtra ON comm.idpadtra = padtra.id
LEFT JOIN ctbcos ON comm.idctbcos1 = ctbcos.id
LEFT JOIN gps ON comm.idgps = gps.id
LEFT JOIN ciu ciugps ON gps.idciu = ciugps.id
LEFT JOIN ciu ciupad ON pad.idciudad = ciupad.id
LEFT JOIN
(SELECT x.NroCfg, ctbcos.cod
 FROM 
   (SELECT '1' AS NroCfg, comm.idctbcos1 AS idctbcos FROM comm WHERE comm.id = pIdComm
    UNION ALL
    SELECT '2', comm.idctbcos2 FROM comm WHERE comm.id = pIdComm
    UNION ALL
    SELECT '3', comm.idctbcos3 FROM comm WHERE comm.id = pIdComm
    UNION ALL
    SELECT '4', comm.idctbcos4 FROM comm WHERE comm.id = pIdComm) x 
   LEFT JOIN ctbcos ON x.idctbcos = ctbcos.id) ctbcos_patente 
 ON ctbcos_patente.NroCfg = vCOT_NroCCos_Patente
WHERE comm.id = pIdComm
LIMIT 1;

-- neto gravado
vImporteTotal = (SELECT SUM(COALESCE(impo, 0.00)) FROM artm WHERE idcomm = pIdcomm);

-- otros valores
-- SujetoGenerador: E: emisor o D: destinatario
-- Si SujetoGenerador = E -> OrigenCuit = EmpresaCuit
vSujetoGenerador='E'; 
vOrigenCuit = vEmpresaCuit;
vProductoNoTermDev = vBoolFalse_Cero;

-- si destinoConsumidorFinal = True e importe >= 5000: puede informarse tipoDoc y nroDoc o CUIT y razonsocial

-- si destinoConsumidorFinal = True e importe < 5000: pueden no informarse los docs y razonSocial = 'NR' (NO REQUERIDO)

IF (vDestinatarioConsumidorFinal = vBoolTrue_Uno) AND (vImporteTotal < vMontoLimiteAnonimo)  THEN
   vDestinatarioNombre = 'NR';
   vDestinatarioCuit   = NULL;
   vDestinatarioTipoDoc = NULL;  
   vDestinatarioNroDoc = NULL;  
ELSE
  IF vDestinatarioCuit IS NOT NULL THEN --prioridad de documento CUIT
    vDestinatarioTipoDoc = NULL;  
    vDestinatarioNroDoc = NULL;  
  END IF;
END IF;

-- si destinoConsumidorFinal = True -> DestinatarioTenedor = False
IF (vDestinatarioConsumidorFinal = vBoolTrue_Uno) THEN
  vDestinatarioTenedor = vBoolFalse_Cero; 
ELSE
  vDestinatarioTenedor = vBoolTrue_Uno;   
END IF;

-- si destinatarioConsumidorFinal = False -> destinatarioCuit es requerido
-- si SujetoGenerador = 'D', destinoCuit = emisorcuit
IF (vDestinatarioConsumidorFinal = vBoolFalse_Cero) AND
   (COALESCE(vDestinatarioCuit, '') = '') AND (vSujetoGenerador = 'D') THEN
  vDestinatarioCuit = vEmpresaCuit;
END IF;  

-- RAISE NOTICE 'vDestinatarioTenedor: %', vDestinatarioTenedor;
-- vEmisorTenedor = NOT vDestinatarioTenedor
IF vDestinatarioTenedor = vBoolTrue_Uno THEN
  vEmisorTenedor = vBoolFalse_Cero;
ELSE
  vEmisorTenedor = vBoolTrue_Uno;
END IF;

vEntregaDomicilioOrigen = vBoolFalse_NO;

-- si vOrigenDomNro='' -> vOrigenDomComple = S/N 
IF COALESCE(vOrigenDomNro, '') = '' THEN
  vOrigenDomComple = vSinNumero;
END IF;

-- si vDestinoDomNro='' -> vDestinoDomComple = S/N 
IF COALESCE(vDestinoDomNro, '') = '' THEN
  vDestinoDomComple = vSinNumero;
END IF;

/* ejemplo de archivo para arba

01|20111111112
02|20080124|0910999990006814|20080124| |E|0| | |30682115722|COMPUMUNDO S.A.|0|Ruta Prov | |S/N| | | |1200|PUERTO DE ESCOBAR|B|
|NO|23246414254|COMPUMUNDO S.A.|0|San Mar n 5797| |S/N| | |
|1766|TABLADA|B|20045162673| | | | | | |1|1234
03|847150|3|100|23891|COMP. SP-3960 VP|UNIDAD|100
03|852110|3|100|23763|VIDEO CAMARA GR-D750|UNIDAD|100
03|852520|3|500|23666|PERS MOTO K1 SILVER + MEM|UNIDAD|500
03|852520|3|700|24159|PERSONAL NOKIA 5200 BLUE|UNIDAD|700
03|852520|3|200|24182|PERS S.ERIC W200 BLAC+MEM|UNIDAD|200
03|852390|3|500|23348|DVD+R X10 4.7GB 10DPR120|UNIDAD|500
03|847170|3|100|23842|HDD 250GB 7200RPM|UNIDAD|100
03|847160|3|500|23896|GAME PAD EUGA 10 BLUE B/W|UNIDAD|500
03|847330|3|400|22891|CART TWINPACK 21 NEGRO|UNIDAD|400
03|850650|3|500|22693|PILAS ALCALINA AA X 4|UNIDAD|500
03|852431|3|200|23846|NORTON ANTIVIRUS 2007|UNIDAD|200
03|847170|3|400|23122|DVDRW 16X/18X DRU830A NEG|UNIDAD|400
03|847170|3|1000|23914|DVDRW AOPEN 20X BOX|UNIDAD|1000
03|852190|3|100|24248|REPROD DVD DVD-AVD800|UNIDAD|100
03|851822|3|100|23621|J.PARL HT-685|UNIDAD|100
04|1*/       
----------------------------------------------------------------------------------
-- registro tipo 01: header (SIEMPRE UN registro tipo 01)
vRegistro_01 = '01' || vSep || vEmpresaCuit || vLF;
-----------------------------------------------------------------------------------
-- ------------ registro 02: cabecera del remito ------------ 
--(para nuestra implementacion UN registro tipo 03 xq siempre tramitamos remito individual)
vRegistro_02 = '02' || vSep || 
                vFecha || vSep || vCodigoUnico|| vSep || COALESCE(vTrasnporteFechaSalida, vSinInformar) || vSep || COALESCE(vTransporteHoraSalida, vSinInformar) || vSep || 
                vSujetoGenerador || vSep || 
                --datos destino
                vDestinatarioConsumidorFinal 
				|| vSep || substring(COALESCE(vDestinatarioTipoDoc, vSinInformar),1,3) 
				|| vSep || substring(COALESCE(vDestinatarioNroDoc, vSinInformar),1,11) 
				|| vSep || substring(COALESCE(vDestinatarioCuit, vSinInformar),1,11) 
				|| vSep || substring(COALESCE(vDestinatarioNombre, vSinInformar),1,50) 
				|| vSep || vDestinatarioTenedor 
				|| vSep || substring(COALESCE(vDestinoDomCalle, vSinInformar),1,40) 
				|| vSep || substring(COALESCE(vDestinoDomNro, vSinInformar),1,5)
				|| vSep || substring(COALESCE(vDestinoDomComple, vSinInformar),1,5) 
				|| vSep || substring(COALESCE(vDestinoDomPiso, vSinInformar),1,3) 
				|| vSep || substring(COALESCE(vDestinoDomDepto, vSinInformar),1,4) 
				|| vSep || substring(COALESCE(vDestinoDomBarrio, vSinInformar),1,30) 
				|| vSep || substring(COALESCE(vDestinoDomCodPostal, vSinInformar),1,8) 
				|| vSep || substring(COALESCE(vDestinoDomLocalidad, vSinInformar),1,50) 
				|| vSep || COALESCE(vDestinoDomProv, vSinInformar) 
				|| vSep || substring(COALESCE(vPropioDestinoDomicilioCodigo, vSinInformar),1,20)
				||vSep||
                --datos origen
                vEntregaDomicilioOrigen 
				|| vSep || substring(COALESCE(vOrigenCuit, vSinInformar),1,11) 
				|| vSep || substring(COALESCE(vOrigenNombre, vSinInformar),1,50)
				|| vSep || vEmisorTenedor 
				|| vSep || substring(COALESCE(vOrigenDomCalle, vSinInformar),1,40) 
				|| vSep || substring(COALESCE(vOrigenDomNro, vSinInformar),1, 5) 
				|| vSep || substring(COALESCE(vOrigenDomComple, vSinInformar),1,5) 
				|| vSep || substring(COALESCE(vOrigenDomPiso, vSinInformar),1,3) 
				|| vSep || substring(COALESCE(vOrigenDomDepto, vSinInformar),1,4) 
				|| vSep || substring(COALESCE(vOrigenDomBarrio, vSinInformar),30) 
				|| vSep || substring(COALESCE(vOrigenDomCodPostal, vSinInformar),1,8) 
				|| vSep || substring(COALESCE(vOrigenDomLocalidad, vSinInformar),1, 50) 
				|| vSep || COALESCE(vOrigenDomProv, vSinInformar) 
				|| vSep || substring(COALESCE(vTransportistaCuit, vSinInformar),1,11) 
				|| vSep ||
                --recorrido
                COALESCE(vRecorridoTipo, vSinInformar) 
				|| vSep || substring(COALESCE(vRecorridoLocalidad, vSinInformar),1,50) 
				|| vSep || substring(COALESCE(vRecorridoCalle, vSinInformar),1,40) 
				|| vSep || substring(COALESCE(vRecorridoRuta, vSinInformar),1,40) 
				|| vSep ||
                --patentes
				substring(COALESCE(vPatenteVehiculo, vSinInformar),1,7) 
				|| vSep || substring(COALESCE(vPatenteAcoplado, vSinInformar),1,7) 
				|| vSep || vProductoNoTermDev 
				|| vSep || TO_CHAR(vImporteTotal, vFtoImporte_12_2) || vLF;
-----------------------------------------------------------------------------------
-- registro 03: detalle de lineas del remito
--detalle de los productos (N registros tipo 03, uno por producto)
vListaRegistros_03 = '';
vRegistro_03 = '';
vLong_PropioCodProd=25;
vLong_PropioDescProd=40;
vLong_PropioCodUni=20;
vSinInformar_ArbaCodArtUni = 3; --3: Unidades (codigo arba)
vSinInformar_CodArtUni = 'UNIDAD';

FOR vArtm_row IN SELECT (SELECT pre_obtenerprecio(vCOT_VarPre, artm.idart, TO_CHAR(comm.fecha, 'AAAA-MM-DD'), comm.codambsuc)) AS arbacodart,
                        artuni.arbacod AS arbacodartuni,
                        art.cod, art.nombre, art.codartuni, artm.cant
                 FROM artm INNER JOIN comm on artm.idcomm = comm.id 
                           INNER JOIN art ON artm.idart = art.id
                           LEFT JOIN artuni ON art.codartuni = artuni.cod
                 WHERE comm.id = pIdcomm
                 ORDER BY artm.orden, artm.id
LOOP
  vRegistro_03 = '03' || vSep ||
                 TO_CHAR(vArtm_row.arbacodart, vFtoCodArt_6 ) ||vSep|| 
                 TO_CHAR(COALESCE(vArtm_row.arbacodartuni, vSinInformar_ArbaCodArtUni),vFtoCodArtUni_1) ||vSep|| 
                 TO_CHAR(vArtm_row.cant, vFtoCantidad_13_2) ||vSep||
				 SUBSTRING(vArtm_row.cod 	FROM 1 FOR vLong_PropioCodProd) ||vSep|| 
                 SUBSTRING(vArtm_row.nombre FROM 1 FOR vLong_PropioDescProd) ||vSep|| 
                 SUBSTRING(COALESCE(vArtm_row.codartuni, vSinInformar_CodArtUni) FROM 1 FOR vLong_PropioCodUni) ||vSep||                 
                 TO_CHAR(vArtm_row.cant, vFtoCantidad_13_2) || vLF; 
    
 vListaRegistros_03 = vListaRegistros_03 || vRegistro_03;              
END LOOP;

---------------------------------------------------------------------------------
-- --- registro tipo 04: cantidad de remitos del lote (SIEMPRE UN registro tipo 01)
vRegistro_04 = '04' || vSep || '1' || vLF;

-- DATOS ARCHIVO COMPLETO
RETURN vRegistro_01 || vRegistro_02 || vListaRegistros_03 || vRegistro_04;

END;
$BODY$;

ALTER FUNCTION cliente.cot_getarchivoremito(integer)
    OWNER TO abacouser;
    
    
    
--    
SELECT aaversion('493.02','493.01');
--

